package main

import (
	"log"
	"net/http"
	"os"

	"github.com/gin-gonic/gin"
	"github.com/inntu/backend/api/routes"
	"github.com/inntu/backend/config"
	_ "github.com/inntu/backend/docs" // 导入生成的docs
	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
)

// @title          NTU校园小程序API文档
// @version        1.0
// @description    南通大学校园小程序的后端API接口文档
// @termsOfService http://swagger.io/terms/

// @contact.name  API Support
// @contact.url   http://www.swagger.io/support
// @contact.email support@swagger.io

// @license.name Apache 2.0
// @license.url  http://www.apache.org/licenses/LICENSE-2.0.html

// @host     tongxiaojun.club
// @BasePath /

// @securityDefinitions.apikey Bearer
// @in header
// @name Authorization

// CORSMiddleware 处理跨域请求
func CORSMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		origin := c.Request.Header.Get("Origin")

		// 允许的域名列表
		allowedOrigins := []string{
			"https://tongxiaojun.club",
			"http://tongxiaojun.club",
			"https://tongxiaojun.club:8081",
			"http://tongxiaojun.club:8081",
			"http://localhost:5174",
			"http://localhost:5175",
			"http://localhost:3000",
		}

		// 检查请求来源是否在允许列表中
		allowed := false
		for _, allowedOrigin := range allowedOrigins {
			if origin == allowedOrigin {
				allowed = true
				break
			}
		}

		if allowed {
			c.Header("Access-Control-Allow-Origin", origin)
		} else {
			// 开发环境允许所有来源
			if os.Getenv("GIN_MODE") != "release" {
				c.Header("Access-Control-Allow-Origin", "*")
			}
		}

		c.Header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
		c.Header("Access-Control-Allow-Headers", "Origin, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
		c.Header("Access-Control-Allow-Credentials", "true")

		if c.Request.Method == "OPTIONS" {
			c.AbortWithStatus(http.StatusNoContent)
			return
		}

		c.Next()
	}
}

func main() {
	// 设置运行模式 - 根据环境变量决定
	if os.Getenv("GIN_MODE") == "release" {
		gin.SetMode(gin.ReleaseMode)
	} else {
		gin.SetMode(gin.DebugMode)
	}

	// 初始化GORM数据库连接
	dbConfig := config.GetDatabaseConfig()
	if err := config.InitGormDatabase(dbConfig); err != nil {
		log.Fatalf("GORM数据库初始化失败: %v", err)
	}
	defer config.CloseGormDatabase()

	// 自动迁移数据库表结构
	//if err := config.AutoMigrate(config.GetGormDB()); err != nil {
	//	log.Fatalf("数据库迁移失败: %v", err)
	//}

	//// 创建数据库索引
	//if err := config.CreateIndexes(config.GetGormDB()); err != nil {
	//	log.Printf("创建数据库索引失败: %v", err)
	//}

	// 初始化种子数据（智能检测机制）
	// 设置环境变量 FORCE_SEED_DATA=true 可强制重新初始化数据库
	if os.Getenv("FORCE_SEED_DATA") == "false" {
		log.Println("检测到FORCE_SEED_DATA=true，将强制重新初始化数据库...")
		if err := config.ForceSeedData(config.GetGormDB()); err != nil {
			log.Printf("强制初始化种子数据失败: %v", err)
		}
	} else {
		if err := config.SeedData(config.GetGormDB()); err != nil {
			log.Printf("初始化种子数据失败: %v", err)
		}
	}

	// 创建新的路由器
	router := gin.New()

	// 添加日志和恢复中间件
	router.Use(gin.Logger(), gin.Recovery())

	// 添加CORS中间件
	router.Use(CORSMiddleware())

	// 设置API路由
	routes.SetupAPIV1Routes(router)

	// 配置Swagger
	router.GET("/docs/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

	// 启动服务器
	log.Println("NTU校园小程序后端服务已启动，监听端口: 8080")
	log.Println("Swagger文档地址: http://localhost:8080/docs/index.html")
	log.Println("GORM数据库已集成，支持ORM操作")

	err := router.Run(":8080")
	if err != nil {
		log.Fatalf("服务器启动失败: %v", err)
	}
}
